// NaN 表示“不是数字”（Not-a-Number）。它是一个特殊的数值，通常表示数学运算失败的结果

// NaN 计算——结果都为NaN
console.log('-------------NaN计算-------------')
console.log(NaN); // NaN
console.log(NaN + 1); // NaN
console.log(NaN - 1); // NaN
console.log(NaN * 2); // NaN
console.log(NaN / 2); // NaN
console.log(NaN % 2); // NaN

// NaN 不等于任何值，包括它自身
console.log('-------------NaN比较-------------')
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
console.log(NaN > 0); // false
console.log(NaN < 0); // false
console.log(NaN == 0); // false
console.log(NaN == 1); // false

// 判断是否为NaN
console.log('----------判断是否为NaN----------------')
console.log(isNaN(NaN)); // true
console.log(Number.isNaN(1)); // false
console.log(isNaN('1')); // false
console.log(isNaN('')); // false


// 什么情况下两个NaN相等？
console.log('-------------两个NaN相等-------------')
console.log(Object.is(NaN, NaN)); // true
// Object.is方法相当于 ===，但对于NaN和-0，+0做了特殊处理(-0 === +0为false)
console.log(Object.is(+0, -0)); // false
console.log(-0 === +0) // true 直接比较-0和+0为true



// null 是一个表示“空”或“无值”的特殊对象值。
// null 计算——null 在算术运算中会被转化为 0
console.log('-------------null计算-')
console.log(null); // null
console.log(null + 1); // 1
console.log(null - 1); // -1
console.log(null * 2); // 0
console.log(null / 2); // 0
console.log(null % 2); // 0

// null比较 ——null 仅等于 null 或 undefined（使用宽松相等 == 时）:
console.log('-------------null比较-')
console.log(null == null); // true
console.log(null === null); // true
console.log(null > 0); // false
console.log(null == 0); // false
console.log(null == undefined); // true
console.log(null === undefined); // false
console.log(null == false); // false
console.log(null == true); // false
console.log(null == ''); // false
console.log(null == 'null'); // false
console.log(null == []); // false
console.log(null == {}); // false

// undefined 表示变量已声明但未定义。
// undefined 计算——undefined 在算术运算中会被转化为 NaN
console.log('-------------undefined计算-')
console.log(undefined); // undefined
console.log(undefined + 1); // NaN
console.log(undefined - 1); // NaN
console.log(undefined * 2); // NaN
console.log(undefined / 2); // NaN
console.log(undefined % 2); // NaN

// undefined 仅等于 undefined 或 null（使用宽松相等 == 时）:
console.log('-------------undefined比较-')
console.log(undefined == undefined); // true
console.log(undefined === undefined); // true
console.log(undefined > 0); // false
console.log(undefined == 0); // false
console.log(undefined == null); // true
console.log(undefined === null); // false
console.log(undefined == false); // false
console.log(undefined == true); // false
console.log(undefined == ''); // false
console.log(undefined == 'undefined'); // false
console.log(undefined == []); // false
console.log(undefined == {}); // false


// [] --- 空数组是一个对象，虽然是空的，但它在运算和比较中有独特的行为。
// 计算 --- 空数组在算术运算中会被转化为 0
console.log('-------------空数组计算-')
console.log([]); // []
console.log([] + 1); // "1" （空数组转换成空字符串，然后与1进行字符串连接）
console.log([0,4] + 1); // "0,41" （数组转换成字符串'0,4'，然后与1进行字符串连接）
console.log([] - 1); // -1
console.log([] * 2); // 0
console.log([] / 2); // 0
console.log([] % 2); // 0

// 空数组与自身是不同的对象，引用不同，无法直接比较:
console.log('-------------空数组比较-')
console.log([] == []); // false
console.log([] == ![]); //  true 右侧先进行取反操作就变成了布尔值false，再与[]进行比较,'=='会进行强制类型转换，宽松相等运算符 == 在比较不同类型的值时会进行类型转换。都转成number,Number([])==0的
console.log([] === []); // false
console.log([] > 0); // false
console.log([] == 0); // true   当数组 [] 被用于比较时，JavaScript 会调用它的 toPrimitive 方法。对于空数组 []，会先尝试调用 valueOf()，但它仍然是对象，因此会继续调用 toString()。空数组的 toString() 结果是一个空字符串 ""。   在比较时，空字符串 "" 会被转换为数字 0
console.log([] == null); // false
console.log([] == undefined); // false
console.log([] == false); // true 空数组 [] 转换为布尔值：任何非空对象（包括空数组）在布尔环境中都会被转换为 true。但在 == 比较中，如果要将对象与布尔值进行比较，JavaScript 会将对象转换为数字再进行比较。[] 转换为 0（因为空数组通过 Number([]) 结果是 0）。false 转换为数字：false 被转换为 0。
console.log([] == true); // false
console.log([] == ''); // true
console.log([] == '[]'); // false
console.log([] == {}); // false [] 和 {} 是不同类型的对象，即使都为空，但它们有各自独立的内存地址。
 

// {}（空对象） --- 空对象是一个对象，虽然是空的，但它在运算和比较中有独特的行为。
// 计算 --- 空对象在算术运算中会被转化为 NaN
console.log('-------------空对象计算-')
console.log({}); // {}
console.log({} + 1); // [object Object]1
console.log({a:1} + 1); // [object Object]1
console.log({} - 1); // NaN
console.log({} * 2); // NaN
console.log({} / 2); // NaN
console.log({} % 2); // NaN


// 空对象与自身也是不同的对象（引用不同)
console.log('-------------空对象比较-')
console.log({} == {}); // false
console.log({} === {}); // false
console.log({} > 0); // false
console.log({} == 0); // false
console.log({} == null); // false
console.log({} == undefined); // false
console.log({} == false); // false  {} 转化成number NaN
console.log({} == true); // false  空对象 {} 将尝试转换为数字，但在隐式类型转换中，对象无法直接转换为数字。因此，最终 {} 将变为 NaN（"Not a Number"）。
console.log({} == ''); // false
console.log({} == '[]'); // false
console.log({} == []); // false
console.log({} == [{}]); // false




// 任何非空对象（包括空数组）在布尔环境中都会被转换为 true!!!!!!!

